]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
signalTracker: Correctly guard against invalid GObject.ConnectFlags
authorMarco Trevisan (Treviño) <mail@3v1n0.net>
Wed, 6 Jul 2022 15:55:46 +0000 (17:55 +0200)
committerMarco Trevisan (Treviño) <mail@3v1n0.net>
Wed, 6 Jul 2022 16:24:15 +0000 (18:24 +0200)
We considered any ConnectFlag value major than SWAPPED as invalid, while
it's technically not fully true as we need to ensure that the passed
value is respecting the whole flags mask.
In fact, per se SWAPPED|AFTER (> SWAPPED) is a valid value (even if we
don't support the AFTER value).

But this makes the check more future-proof.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2366>

js/misc/signalTracker.js

index 9f8a9a70f107110c22f69aca189540c1bb5b0236..30de94e99071d136490606420fbc39f8d5ae8001 100644 (file)
@@ -184,16 +184,18 @@ function connectObject(thisObj, ...args) {
             return [signalName, handler, 0, arg, ...rest];
 
         const flags = arg;
-        if (flags > GObject.ConnectFlags.SWAPPED)
+        let flagsMask = 0;
+        Object.values(GObject.ConnectFlags).forEach(v => (flagsMask |= v));
+        if (!(flags & flagsMask))
             throw new Error(`Invalid flag value ${flags}`);
-        if (flags === GObject.ConnectFlags.SWAPPED)
+        if (flags & GObject.ConnectFlags.SWAPPED)
             throw new Error('Swapped signals are not supported');
         return [signalName, handler, flags, ...rest];
     };
 
     const connectSignal = (emitter, signalName, handler, flags) => {
         const isGObject = emitter instanceof GObject.Object;
-        const func = flags === GObject.ConnectFlags.AFTER && isGObject
+        const func = (flags & GObject.ConnectFlags.AFTER) && isGObject
             ? 'connect_after'
             : 'connect';
         const emitterProto = isGObject